#ifndef MAPGENERATOR_H
#define MAPGENERATOR_H

#include <vector>
#include <random>

class Map_Item {
    friend class MapGenerator;
private:
    double pro;
    char item;
public:
    Map_Item(char item, double pro) :pro(pro), item(item) {}
};


class MapGenerator {
    static const char emptychar;                // 空号符
    static const char takePlacechar;            // 占位符
    static const int expend_dir;                // 拓展方向
    static const double default_std_good_pro;   // 默认初始密度
    static const double spread_rate;            // 扩展系数
    static const double base_spread_rate;       // 扩展基础概率
    static const int processTime;               // 再处理次数
    static const double origin_process_rate;    // 再处理因子
    static const int radius;                    // 距离阈值
    static const double decayFactor;            // 距离递减因子
    static const int dir[8][2];
    double std_good_pro;                        // 初始密度
public:
    MapGenerator(int width, int height, std::vector<Map_Item> &map_items, double _std_good_pro = default_std_good_pro);

    std::vector<std::vector<char>>& generateMap();// 生成地图

    // 判断位置是否有效，中间一部分不生成item所以无效
    inline bool is_valid(int i, int j) {
        if (i >= 0 && i < width && j >= 0 && j < height) {
            int cx = width / 2, cy = height / 2;
            if (abs(cx - i) <= 4 && abs(cy - j) <= 3) {
                return false;
            }
            else {
                return true;
            }
        }
        return false;
    }
    inline std::vector<std::vector<char>>& getGrid(){return grid;}
private:
    int width;
    int height;
    std::vector<Map_Item> map_items;
    std::mt19937 gen;
    std::uniform_real_distribution<double> dis;
    std::vector<std::vector<char>> grid;

    // 再处理判断
    bool shouldRemove(int x, int y, double rate);

    // 再处理地图 消除噪点
    void processMap(double rate);

    // 生成地图 扩展节点
    void spreadItem(char item, int x, int y, double item_pro);

};

#endif // MAPGENERATOR_H
